communityfandomcom_de-20200214-history
Forum-Diskussionsfaden:Technische Fragen/@comment-20374729-20140617195108/@comment-5071245-20140619175253
Sorry für den / die Bugs. Ich bin den Code nochmal durchgegangen und mir ist aufgefallen, dass er zur Zeit IMMER und ÜBERALL aufgerufen wird - er sollte aber eigentlich nur bei Vorhandensein eines Tabbers aufgerufen werden. (Das mit dem "?version=false" ist ein Ausstieg für die Rekursion, wenn man am obersten Element angekommen ist und kein data-Version gefunden wurde. - Ja, es ist möglich Links beliebig tief zu verschachteln, in Tabellen, Bilder und andere Spielereien. Jedesmal müsste die Funktion zuverlässig die nächst höhere data-Version dazu finden.) Habe jetzt zwei Sicherheitsmechanismen mit eingebaut in die neue Version: Zum Einen wird geschaut, ob es überhaupt ein Tabber-Objekt im Artikel gibt und nur dann reagiert. Und zum Anderen wird geschaut, ob die übergebene Version auch vorhanden ist zum Tabbern. (damit lustige Leute nicht einfach ?version=troll posten und sich wundern, dass ihnen eine leere Seite angezeigt wird. Hab die Voreinstellungs-Version-Variable an den Anfang des Codes gezogen, damit man sie sofort sieht, wenn man was ändern will. MediaWiki:Tabber.js var Version = 'Legends'; // Standardmäßig soll ein Artikel mit Legends geöffnet werden //Diese Funktion liest alle übergebenen Variablen aus und gibt diese in einem Objekt wieder function Werteliste (querystring) { if (querystring '') return; var wertestring = querystring.slice(1); // Übergeben wird eine URL als Array. Der Link wir abgeschnitten var paare = wertestring.split('&'); var paar, name, wert; for (var i = 0; i < paare.length; i++) { paar = paarei.split('='); name = paar0; wert = paar1; name = unescape(name).replace('+', ' '); wert = unescape(wert).replace('+', ' '); thisname = wert; } var HTML_link = window.location + ''; this'PageName' = HTML_link.split('=')0.split('/')4.replace(/_/g, ' ').split('?')0; } var HTMLAgument = new Werteliste(location.search); //Objekt HTMLArgument enthält alle übergebenen Variablen function ChangeVersion(NewVersion) { Version = NewVersion; //Alle DIV-Elemente, die im Artikel enthalten sind im Objekt "TabberObj" speichern var TabberObj = document.getElementById("WikiaMainContentContainer").getElementsByTagName('div'); //Jedes Objekt in "TabberObj" einzeln durchgehen und nacheinander bearbeiten for (var i= 0; i< TabberObj.length; i++){ //Überprüfen ob aktuelles Objekt ein SWTabber ist if (TabberObji.className.toLowerCase() 'swtabber'){ //Überprüfen, ob aktuelles Objekt angezeigt werden soll oder nicht if (TabberObji.getAttribute('data-Version').toLowerCase() Version.toLowerCase()) TabberObji.style.display = ''; else TabberObji.style.display = 'none'; } } //Funktion erfolgreich beenden (ein Returnwert ist nicht nötig, aber guter Stil). return true; } //Alle DIV-Elemente, die im Artikel enthalten sind im Objekt "TabberObj" speichern var TabberMenuObj = document.getElementById("WikiaMainContentContainer").getElementsByTagName('div'); //Jedes Objekt in "TabberMenuObj" einzeln durchgehen und nacheinander bearbeiten for (var i= 0; i< TabberMenuObj.length; i++){ //Wenn ein Menü-Objekt gefunden wird, dann diesem eine Funktion zuweisen. if (TabberMenuObji.className.toLowerCase() 'swtabber-knopf'){ TabberMenuObji.onclick=function(){ChangeVersion(this.getAttribute('data-Version'));}; } } function VaterNode(ReverseObjekt){ if (ReverseObjekt.getAttribute('data-Version')) return ReverseObjekt.getAttribute('data-Version'); if (ReverseObjekt.id 'WikiaMainContentContainer') return false; return (VaterNode(ReverseObjekt.parentNode)); } //Alle Links im Artikel heraus suchen var SearchDIV = document.getElementById("WikiaMainContentContainer").getElementsByTagName('div'); var MindestensEinTabberElementVorhanden = false; for (i=0; i < SearchDIV.length; i++){ // Hier wird geschaut, ob es mindestens ein Tabber-Element gibt, sonst den ganzen Code nicht verwenden. if (SearchDIVi.getAttribute('data-Version')) MindestensEinTabberElementVorhanden = true; // Gucken, ob übergebene Tabber-Vorauswahl vorhanden ist und nur dann ändern // Verhindert, dass unsinnige Tabber-Auswahlen verwendet werden und eine leere Seite gezeigt wird. if (HTMLAgument'version' && SearchDIVi.getAttribute('data-Version')){ if (HTMLAgument'version'.toLowerCase() SearchDIVi.getAttribute('data-Version').toLowerCase()) Version = HTMLAgument'version'; } } if (MindestensEinTabberElementVorhanden){ var VersionLink = document.getElementById("WikiaMainContentContainer").getElementsByTagName('a'); for (i = 0; i < VersionLink.length; i++){ //Es darf kein Fragezeichen bereits enthalten sein (sonst ist es wahrscheinlich ein RED-Link) if(VersionLinki.href.split('?')1) continue; //Link ergänzen um Version in der er sich befindet. VersionLinki.href = VersionLinki.href+'?version='+VaterNode(VersionLinki.parentNode); } ChangeVersion(Version); } Jetzt haben wir nur noch das Problem mit den Ära-Buttons. Ich kann sie zwar auslesen und auch vorbelegen, doch die Sache ist, wenn mein Script aus irgend einem Grund langsamer ist, als das andere Skript, das diese Box hoch lädt, dann ist die Box weg, bevor sie die richtige Signatur bekommen hat. Es wäre also gut die Vorlage:Ära um eine Eigenschaft "Version" oder so zu ergänzen. Diese Eigenschaft fügt in die öffnende DIV-Box am Anfang ein > }| data-Version=" }"}}< ein. Auf den Tabber-Seiten muss man dann bestimmen, welche Box wohin gehört. - Vorteil ist halt, dass man alle Boxen auch außerhalb der Tabber setzen kann, da sie ohnehin aus dem Artikel verschwinden und in den Header gesetzt werden.